/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.admin;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Doenca;
import br.ufc.quixada.adrs.model.Produtor;
import br.ufc.quixada.adrs.model.RelatorioResult2;
import br.ufc.quixada.adrs.model.Visita;
import br.ufc.quixada.adrs.service.VisitaService;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Welligton
 */
public class CmdMontaRelatorioQSPassoQuatro implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {

        HttpSession sessao = request.getSession(true);
        String[] mensagemErro = new String[7];
        mensagemErro[1] = "Por favor, especifique um período para o relatório";
        mensagemErro[2] = "Por favor, verifique o preenchemento da data que indica o início do período do relatório.";
        mensagemErro[3] = "Por favor, verifique o preenchemento da data que indica o fim do período do relatório.";
        mensagemErro[4] = "Por favor, selecione um ou alguns filtros para o relatório";
        mensagemErro[5] = "Período selecionado não contem visitas";
        mensagemErro[6] = "Por favor, especifique um período(mês e ano) para o relatório";

        ArrayList<Produtor> produtoresSelecionados = (ArrayList<Produtor>) sessao.getAttribute("produtoresSelecionadoQS");

        String dataIni = "";
        String dataFim = "";
        String anemia = request.getParameter("anemia");
        String ceratoconjuntivite = request.getParameter("ceratoconjuntivite");
        String cirurgias = request.getParameter("cirurgias");
        String diarreia = request.getParameter("diarreia");
        String ectima = request.getParameter("ectima");
        String linfadenite = request.getParameter("linfadenite");
        String mastite = request.getParameter("mastite");
        String miiase = request.getParameter("miiase");
        String onfalonflebite = request.getParameter("onfalonflebite");
        String piolho = request.getParameter("piolho");
        String verminose = request.getParameter("verminose");
        String outros = request.getParameter("outros");
        String mes = (String) request.getParameter("mes");
        String ano = (String) request.getParameter("ano");
        if (ano == null || ano.length() != 4) {
            ano = "-1";
        }
        int mes2 = Integer.parseInt(mes);
        int ano2 = Integer.parseInt(ano);
        if (mes2 == -1 || ano2 == -1) {
            sessao.setAttribute("erro", mensagemErro[6]);
            return "/admin/admin_monta_relatorio_qs_passo_quatro.jsp";
        } else {
            Calendar calendario = new GregorianCalendar();
            calendario.set(Calendar.YEAR, ano2); //Definindo o ano
            calendario.set(Calendar.MONTH, mes2); //Definindo o mês atual
            //Pega o número de dias para o mês no ano corrente
            int ultimoDiaMes = calendario.getActualMaximum(Calendar.DAY_OF_MONTH);
            String ultimoDia = Integer.toString(ultimoDiaMes);
            int ano3 = calendario.get(Calendar.YEAR);
            String stringAno = Integer.toString(ano3);
            int mesCorreto = Integer.parseInt(mes);
            String mesCorreto2 = Integer.toString(mesCorreto + 1);
            if ((mes2 == 0) || (mes2 == 1) || (mes2 == 2) || (mes2 == 3) || (mes2 == 4) || (mes2 == 5) || (mes2 == 6) || (mes2 == 7) || (mes2 == 8) || (mes2 == 9)) {
                dataIni = "01/" + "0" + mesCorreto2 + "/" + stringAno;
                dataFim = ultimoDia + "/0" + mesCorreto2 + "/" + stringAno;

            } else {
                dataIni = "01/" + mesCorreto2 + "/" + stringAno;
                dataFim = ultimoDia + "/" + mesCorreto2 + "/" + stringAno;
            }
        }

        int codErro = validaCampos(dataIni, dataFim, anemia, ceratoconjuntivite, cirurgias, diarreia, ectima, linfadenite, mastite, miiase, onfalonflebite, piolho, verminose, outros);
        if (codErro != 1) {
            sessao.setAttribute("erro", mensagemErro[codErro * (-1)]);
            return "/admin/admin_monta_relatorio_qs_passo_quatro.jsp";
        }

        if (!validaData(dataIni, dataFim, produtoresSelecionados)) {
            sessao.setAttribute("erro", mensagemErro[5]);
            return "/admin/admin_monta_relatorio_qs_passo_quatro.jsp";
        }

        int qtAnemia, qtCeratoconjuntivite, qtCirurgias, qtDiarreia, qtEctima, qtLinfadenite, qtMastite, qtMiiase, qtOnfalonflebite, qtPiolho, qtVerminose, qtOutros;
        qtAnemia = qtCeratoconjuntivite = qtCirurgias = qtDiarreia = qtEctima = qtLinfadenite = qtMastite = qtMiiase = qtOnfalonflebite = qtPiolho = qtVerminose = qtOutros = 0;

        //Conta o numero de ocorrências de cada doença
        for (Produtor p : produtoresSelecionados) {
            if (anemia != null) {
                qtAnemia += totalDeOcorrenciaDoencas(p, dataIni, dataFim, anemia);
            }
            if (ceratoconjuntivite != null) {
                qtCeratoconjuntivite += totalDeOcorrenciaDoencas(p, dataIni, dataFim, ceratoconjuntivite);
            }
            if (cirurgias != null) {
                qtCirurgias += totalDeOcorrenciaDoencas(p, dataIni, dataFim, cirurgias);
            }
            if (diarreia != null) {
                qtDiarreia += totalDeOcorrenciaDoencas(p, dataIni, dataFim, diarreia);
            }
            if (ectima != null) {
                qtEctima += totalDeOcorrenciaDoencas(p, dataIni, dataFim, ectima);
            }
            if (linfadenite != null) {
                qtLinfadenite += totalDeOcorrenciaDoencas(p, dataIni, dataFim, linfadenite);
            }
            if (mastite != null) {
                qtMastite += totalDeOcorrenciaDoencas(p, dataIni, dataFim, mastite);
            }
            if (miiase != null) {
                qtMiiase += totalDeOcorrenciaDoencas(p, dataIni, dataFim, miiase);
            }
            if (onfalonflebite != null) {
                qtOnfalonflebite += totalDeOcorrenciaDoencas(p, dataIni, dataFim, onfalonflebite);
            }
            if (piolho != null) {
                qtPiolho += totalDeOcorrenciaDoencas(p, dataIni, dataFim, piolho);
            }
            if (verminose != null) {
                qtVerminose += totalDeOcorrenciaDoencas(p, dataIni, dataFim, verminose);
            }
            if (outros != null) {
                qtOutros += totalDeOcorrenciaDoencas(p, dataIni, dataFim, outros);
            }
        }
        //Contar quantas doenças foram selecionadas
        int numDoencasSelecionas = 0;
        if (anemia != null) {
            numDoencasSelecionas++;
        }
        if (ceratoconjuntivite != null) {
            numDoencasSelecionas++;
        }
        if (cirurgias != null) {
            numDoencasSelecionas++;
        }
        if (diarreia != null) {
            numDoencasSelecionas++;            
        }
        if (ectima != null) {
            numDoencasSelecionas++;
        }
        if (linfadenite != null) {
            numDoencasSelecionas++;
        }
        if (mastite != null) {
            numDoencasSelecionas++;
        }
        if (miiase != null) {
            numDoencasSelecionas++;
        }
        if (onfalonflebite != null) {
            numDoencasSelecionas++;
        }
        if (piolho != null) {
            numDoencasSelecionas++;
        }
        if (verminose != null) {
            numDoencasSelecionas++;
        }
        if (outros != null) {
            numDoencasSelecionas++;
        }

        //Povoar dados que serão exibidos nos relatorios
        String[] filtros = new String[numDoencasSelecionas];
        // filtros = init(filtros);
        int[] dados = new int[numDoencasSelecionas];
        int posicaoVetor = 0;
        if (anemia != null) {
            filtros[posicaoVetor] = "Anemia";
            dados[posicaoVetor++] = qtAnemia;
        }
        if (ceratoconjuntivite != null) {
            filtros[posicaoVetor] = "Ceratoconjuntivite";
            dados[posicaoVetor++] = qtCeratoconjuntivite;
        }
        if (cirurgias != null) {
            filtros[posicaoVetor] = "Cirurgias";
            dados[posicaoVetor++] = qtCirurgias;
        }
        if (diarreia != null) {
            filtros[posicaoVetor] = "Diarreia";
            dados[posicaoVetor++] = qtDiarreia;
        }

        if (ectima != null) {
            filtros[posicaoVetor] = "Ectima";
            dados[posicaoVetor++] = qtEctima;
        }
        if (linfadenite != null) {
            filtros[posicaoVetor] = "Linfadenite";
            dados[posicaoVetor++] = qtLinfadenite;
        }
        if (mastite != null) {
            filtros[posicaoVetor] = "Mastite";
            dados[posicaoVetor++] = qtMastite;
        }
        if (miiase != null) {
            filtros[posicaoVetor] = "Miiase";
            dados[posicaoVetor++] = qtMiiase;
        }
        if (onfalonflebite != null) {
            filtros[posicaoVetor] = "Onfalonflebite";
            dados[posicaoVetor++] = qtOnfalonflebite;
        }
        if (piolho != null) {
            filtros[posicaoVetor] = "Piolho";
            dados[posicaoVetor++] = qtPiolho;
        }
        if (verminose != null) {
            filtros[posicaoVetor] = "Verminose";
            dados[posicaoVetor++] = qtVerminose;
        }
        if (outros != null) {
            filtros[posicaoVetor] = "Outros";
            dados[posicaoVetor++] = qtOutros;
        }

        sessao.setAttribute("dataIni", dataIni);
        sessao.setAttribute("dataFim", dataFim);
        sessao.setAttribute("ano", ano);
        sessao.setAttribute("filtros", filtros);
        sessao.setAttribute("dados", dados);

        return "/admin/relatorio_qs_gerado.jsp";


    }

    private int validaCampos(String dataIni, String dataFim, String anemia, String ceratoconjuntivite, String cirurgias, String diarreia, String ectima, String linfadenite, String mastite, String miiase, String onfalonflebite, String piolho, String verminose, String outros) {

        if ((dataFim == null || dataFim.trim().isEmpty()) || (dataIni == null || dataIni.trim().isEmpty())) {
            return -1;
        }
        if (!UtilAdrs.validaData(dataIni)) {
            return -2;
        }
        if (!UtilAdrs.validaData(dataFim)) {
            return -3;
        }
        if (anemia == null && ceratoconjuntivite == null && cirurgias == null && diarreia == null && ectima == null && linfadenite == null && mastite == null && miiase == null && onfalonflebite == null && piolho == null && verminose == null && outros == null) {
            return -4;
        }
        return 1;
    }

    private boolean validaData(String inicioP, String fimP, ArrayList<Produtor> prods) {
        VisitaService vServ = new VisitaService();
        for (Produtor p : prods) {
            List<Visita> visitas = vServ.getVisitasByProdutorEAdrs(p.getId(), p.getAdrs().getId());
            for (Visita a : visitas) {
                if (a.getQuestionarioSanitario() == null) {
                    continue;
                }
                DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
                Date date = a.getData();
                Date data = UtilAdrs.treatToDate(dateFormat.format(date));
                Date inicio = null;
                Date fim = null;
                try {
                    inicio = dateFormat.parse(inicioP);
                    fim = dateFormat.parse(fimP);
                } catch (Exception ex) {
                    //não faz nada
                }
                if ((inicio.before(data)) && (fim.after(data))) {
                    return true;
                }
            }

        }

        return false;

    }

    private int totalDeOcorrenciaDoencas(Produtor prods, String inicioP, String fimP, String nomeD) {
        List<Visita> visitas = prods.getVisitas();

        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date ini = null;
        Date fim = null;

        ini = UtilAdrs.treatToDate(inicioP);
        fim = UtilAdrs.treatToDate(fimP);

        int totalOcorrencias = 0;
        for (Visita v : visitas) {
            Date visi = UtilAdrs.treatToDate(dateFormat.format(v.getData()));
            if ((visi.before(fim) || visi.equals(fim)) && (visi.equals(ini) || visi.after(ini))) {
                if (v.getQuestionarioSanitario() == null) {
                    continue;
                }

                for (Doenca doe : v.getQuestionarioSanitario().getDoencas()) {
                    if (doe.getTipo().getNome().equals(nomeD)) {
                        totalOcorrencias += doe.getQuantidadeDeCasos();
                    }
                }
            }

        }
        return totalOcorrencias;

    }

    private String[] init(String[] filtros) {

        for (int i = 0; i < filtros.length; i++) {
            filtros[i] = "-1";
        }
        return filtros;
    }
}
